// 第一步  需要先安装 react-redux     执行 npm i react-redux  redux

//  第二步  创建一个 store对象  
// applyMiddleware 是redux自带的接入中间件的函数
import  { createStore ,applyMiddleware ,combineReducers} from 'redux'  // 官方已经不推荐我们使用createStore来创建 store对象


// 使用 redux thunk 中间件 让我们的redux支持异步操作 
// npm i redux-thunk  先执行安装
import thunk from 'redux-thunk';  // 引入thunk中间件

// 使用单独声明的reducer 方便后面通过 combineReducers进行合并
import userReducer from './userReducer';
import orderReducer from './orderReducer';

// 引入调试工具支持
import { composeWithDevTools } from '@redux-devtools/extension';

// 实现数据持久化  redux-persist
import { persistStore,persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // localStorage
import storageSession from 'redux-persist/lib/storage/session'; // sessionStorage

// 配置存储配置的信息
const persistConfig = {
    key:'root',// 在浏览器的本地存储当中 使用哪个key来保存redux 的全局状态的数据
    storage: storage , // 使用localStorage还是sessionStorage来保存数据 上面的storage和storageSession二选1
}


const initState = {
    userInfo:{},
    version: '1.0.0'
}


const reducer = (state = initState,action)=>{
    // state 是reducer函数 得到的第一个参数 这个参数是当前没有修改之前的状态
    // action 就是dispatch传递过来的(传参的唯一方式) action对象 
    //  action在redux当中是一个约定为  拥有type属性的对象
    console.log('我是origin Reducer')
    console.log('action in store ', action)
    // 根据action 来执行对应的 全局状态的修改
    //  如果组织你的逻辑业务 是开发者自己的事情  redux并不参与

    const { type,payload }= action
   
    if(type === 'setVersion'){
        state.version = payload
    }

    return {...state}

}


const rootReduer = combineReducers({
    user:userReducer,
    order:orderReducer,
    origin:reducer
})


//  createStore 是我们创建一个store的方法  传入一个 reducer函数
//  reducer函数？？？  就是修改 全局状态的函数 ，通过reducer返回一个新的值来更新全局状态
// const store = createStore(reducer,applyMiddleware(thunk))

// 当我们打算实现数据的持久化的时候 createStore传入的reducer就需要使用经过持久化处理的PersistReducer
// 原来的reuder变化一个支持持久化存储的reducer
const PersistReducer = persistReducer(persistConfig, rootReduer);
const store = createStore(PersistReducer,composeWithDevTools(  applyMiddleware(thunk) ))
export const persistor = persistStore(store) // 还要单独的生成一个持久化对象


// 第三步 导出store对象
export  default store;
